import {ElMessage} from "element-plus";
import {computed} from "vue";

/* ==================== 计算属性 ==================== */

// 获取本地静态资源
export const LOCAL_RES = computed(() => url => new URL(url, import.meta.url).href);

/*
 * 系统睡眠
 *
 * @param time 睡眠时间，单位毫秒
 * */
export function sleep(time) {
    return new Promise((resolve) => setTimeout(resolve, time));
}

/*
 * 判断非空值
 *
 * @param value 被判断的值
 * @return true 表示不为 null 也不为 undefined
 * */
export function isNotNull(value) {
    return value !== null && value !== undefined;
}

/*
 * 判断空值
 *
 * @param value 被判断的值
 * @return true 表示为 null 或 undefined
 * */
export function isNull(value) {
    return !isNotNull(value);
}

/*
 * 判断是否存在空值
 *
 * @param values 被判断的值，不定长列表
 * @return true 表示包含 null 或 undefined
 * */
export function hasNull(...values) {
    for (let value in values) {
        if (isNull(value)) {
            return true;
        }
    }
    return false;
}

/*
 * 判断空字符串
 *
 * @param value 被判断的值
 * @return true 表示不为 null 或 undefined 或空字符串
 * */
export function isNotEmpty(value) {
    return value !== null && value !== undefined && value !== '';
}

/*
 * 判断非空字符串
 *
 * @param value 被判断的值
 * @return true 表示为 null 或 undefined 或空字符串
 * */
export function isEmpty(value) {
    return !isNotEmpty(value);
}

/*
 * 判断是否存在空字符串
 *
 * @param values 被判断的值，不定长列表
 * @return true 表示包含 null 或 undefined 或空字符串
 * */
export function hasEmpty(...values) {
    for (let value in values) {
        if (isEmpty(value)) {
            return true;
        }
    }
    return false;
}

/*
 * 封装功能暂未开放的EL弹窗
 */
export function notYet() {
    ElMessage.warning('该功能暂未开放！');
}

/*
 * 将JSON对象转为QS字符串
 *
 * @param jsonObj JSON对象
 * @return 查询串，如 a=1&b=2
 * */
export function jsonToQs(jsonObj) {
    return Object.keys(jsonObj).map(key => {
        if (Array.isArray(jsonObj[key])) {
            return jsonObj[key].map(e => key + '=' + e).join('&');
        }
        return key + '=' + jsonObj[key]
    }).join('&');
}

/*
 * 生成len位随机字符串
 *
 * @param len 随机字符串位数，范围在1 ~ 36之间，默认为18
 * @return 随机字符串
 * */
export function randomStr(len = 18) {

    // 随机一个小数，并将其转为36进制字符
    let result = Math.random().toString(36);

    // 消除所有点符号
    result = result.replaceAll('.', '');

    // 截取后len位字符串并返回: len不小于1且不超过36
    len = Math.max(len, 1);
    len = Math.min(len, 36);
    return result.slice(-len);
}

/*
 * 日期字符串处理：1999-01-02T12:12:12 -> 1999/01/02 12:12
 *
 * @param dateStr 日期字符串
 * @return 格式化后的日期字符串
 * */
export function dateFormat(dateStr) {

    // 用于将六大元素处理为两位数格式（年除外）
    function toDouble(e) {
        return e < 10 ? '0' + e : e;
    }

    // 将日期字符串转为日期格式
    let date = new Date(dateStr);

    // 获取日期中的元素: 年，月，日，时，分
    let yy = toDouble(date.getFullYear());
    let mm = toDouble(date.getMonth() + 1);
    let dd = toDouble(date.getDate());
    let hh = toDouble(date.getHours());
    let mi = toDouble(date.getMinutes());

    // 返回美化后的日期字符串
    return `${yy}年${mm}月${dd}日 ${hh}:${mi}`;
}

/*
 * 封装文件上传前的校验过程
 *
 * @param file 文件对象，必传
 * @param allowTypes 允许的MIME数组，必传，如 ['image/jpeg', 'image/png']
 * @param maxSize 允许的文件最大值，单位MB，默认10MB
 * @return true校验成功，false校验失败
 */
export function checkFile(file, allowTypes, maxSize = 10) {

    // 空值保护
    if (!file || !allowTypes) return false;

    // 校验文件MIME类型
    if (!allowTypes.includes(file.type)) {
        ElMessage.warning(`仅支持 ${allowTypes.toString()} 格式！`);
        return false;
    }

    // 校验文件大小
    if (file.size / 1024 / 1024 > maxSize) {
        ElMessage.error(`文件大小不能超过 ${maxSize} MB`)
        return false;
    }

    return true;
}